//
// Copyright (c) 2014, 保留所有权利。
//
// TradeUtil.java
//
// 作    者：王红燕
// 当前版本：1.0
// 2014 下午3:52:25
//
// 
//
package com.vanke.agent.common;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Timestamp;

import net.sf.json.JSONObject;

import org.apache.log4j.Logger;

import com.vanke.agent.ADataSource;
import com.vanke.agent.C;
import com.vanke.agent.bean.FlagLogBean;
import com.vanke.agent.bean.FollowRecord;
import com.vanke.agent.bean.NoticeBean;

/**
 *
 */
public class TradeUtil {
	static Logger log = Logger.getLogger(TradeUtil.class);
	/**
	 * 保存跟进记录
	 */
	public static String saveFollowRecord(Connection con, FollowRecord fr,
			Logger log) {
		String recommendGUID=null;
		long cstGUID = fr.getCstGUID();				// 数据中心GUID
		String OriCstGUID = fr.getOriCstGUID();     // 明源GUID
		String ProjGUID = fr.getProjGUID();         //	项目GUID
		String ProjCode = fr.getProjCode();         //	项目Code
		String ReceiveType = fr.getReceiveType();   //	跟进类型，明源中的文字
		int followType = fr.getFollowType();        //	跟进类型
		int cstType = fr.getCstType();              //	客户类型，固定为4
		Timestamp ReceiveDate = fr.getReceiveDate();//	跟进时间
		double total = fr.getTotal();				//	金额，认筹、认购、签约、回款时有效
		String tradeGUID = fr.getTradeGUID();		//	交易GUID，认筹是为BookingGUID
		String comment = fr.getComment();			//	注释说明
		String roomGUID = fr.getRoomGUID();			//	房间GUID
		String room = fr.getRoom();					//	房号
		String huxing = fr.getHuxing();				//	户型
		//	} //~saveFollowRecord
		//
		//	/*
		//	 * 保存跟进记录
		//	 */
		//	public static void saveFollowRecord(Connection con,//
		//			long cstGUID,						 // 数据中心GUID
		//			String OriCstGUID,                   // 明源GUID
		//			String ProjGUID,                     //	项目GUID
		//			String ProjCode,                     //	项目Code
		//			String ReceiveType,                  //	跟进类型，明源中的文字
		//			int followType,                      //	跟进类型
		//			int cstType,                         //	客户类型，固定为4
		//			Timestamp CreatonDate,				 //	跟进时间
		//			float total,						 //	金额，认筹、认购、签约、回款时有效
		//			String tradeGUID,					 //	交易GUID，认筹是为BookingGUID
		//			String comment,						 //	注释说明
		//			String roomGUID,					 //	房间GUID
		//			String room,					 	 //	房号
		//			String huxing,					 	 //	户型
		//			Logger log							 // 日志
		//	) {             //
		String info = "[cstGUID=" + cstGUID + ",OriGUID=" + OriCstGUID
				+ ",ProjCode=" + ProjCode + ",ReceiveType=" + ReceiveType
				+ ",followType=" + followType + "]";
		String table = CstUtil.retrieveCstReceiveTable(cstGUID);
		String fields = "CstGUID,OriCstGUID,ProjGUID,ProjCode,ReceiveType,followType,cstType,CreatonDate,ReceiveDate,SrcType,Total,TradeGUID,`Comment`,RecommendGUID,RoomGUID,Room,Huxing";
		String sql = CstUtil.formatInsertSql(table, fields);
		//"(CstGUID,OriCstGUID,ProjGUID,ProjCode,ReceiveType,followType,cstType,CreatonDate,ReceiveDate,SrcType,Total,TradeGUID,`Comment`)";
		PreparedStatement pstmt = null;
		recommendGUID = RecommendUtil.getLatestRecommendGUID(con,
				cstGUID, ProjCode);
		try {
			pstmt = con.prepareStatement(sql);
			pstmt.setLong(1, cstGUID);
			pstmt.setString(2, OriCstGUID);
			pstmt.setString(3, ProjGUID);
			pstmt.setString(4, ProjCode);
			pstmt.setString(5, ReceiveType);
			pstmt.setInt(6, followType);
			pstmt.setInt(7, cstType);
			pstmt.setTimestamp(8, new Timestamp(System.currentTimeMillis()));
			pstmt.setTimestamp(9, ReceiveDate);
			pstmt.setString(10, "my");
			pstmt.setDouble(11, total);
			pstmt.setString(12, tradeGUID);
			pstmt.setString(13, comment);
			pstmt.setString(14, recommendGUID);

			pstmt.setString(15, roomGUID);
			pstmt.setString(16, room);
			pstmt.setString(17, huxing);
			pstmt.executeUpdate();
			log.info("follow record saved" + info);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("save follow record error: " + e + "\n" + info);
		} finally {
			ADataSource.close(pstmt);
		}
		FlagLogBean flb = new FlagLogBean();
		flb.setAppid(C.DC_APPID);
		flb.setCstGUID(cstGUID);
		flb.setOriCstGUID(OriCstGUID);
		flb.setProjCode(ProjCode);
		// String ReceiveType,                  //	跟进类型，明源中的文字
		flb.setFlag(followType);
		flb.setFlagTime(ReceiveDate);
		flb.setComment(comment);
		flb.setRoomGUID(roomGUID);
		flb.setRecommendGUID(recommendGUID);
		// private String SubStatus;		// 子状态，即每一个Flag对应的自有状态,
		// private String UserGUID; 		// 置业顾问题,
		flb.setPrmAgent(fr.getUserGUID());
		flb.setRefGUID(fr.getRefGUID());
		FlagLog.saveFlagLog(flb);
		return recommendGUID;
	} //~saveFollowRecord

	//	/*
	//	 * 发通知
	//	 */
	//	public static void sendNotice(//
	//			String msgType,			// 消息队列的消息类型 
	//			long uid, 				// 客户数据中心GUID
	//			String projCode,		// 项目编号
	//			Timestamp time, 		// 跟进时间
	//			float total, 			// 金额，针对认购、签约等
	//			int followType, 		// 类型，表认筹、认购、签约、回款等
	//			String content,			// 跟进内容描述
	//			int state				// 状态，－1:不添加状态字段，0:新增，1:退房，2:换房，3:作废，4:取消/撤消
	//	) {
	//		sendNotice(msgType,         // 消息队列的消息类型                                          
	//				uid,                // 客户数据中心GUID                                         
	//				projCode,           // 项目编号                                               
	//				time,               // 跟进时间                                               
	//				total,              // 金额，针对认购、签约等                                        
	//				followType,         // 类型，表认筹、认购、签约、回款等                                   
	//				content,            // 跟进内容描述                                             
	//				state,              // 状态，－1:不添加状态字段，0:新增，1:退房，2:换房，3:作废，4:取消/撤消          
	//				null,               // 房间GUID                                             
	//				null,               // 房间号(车位号)                                           
	//				null);              // 房型(店铺、车位、户型)                                       
	//	} //~sendNotice

	/**
	 * 发通知
	 */
	public static void sendNotice(NoticeBean bean) {
		String msgType = bean.getMsgType();	// 消息队列的消息类型 
		long cstGuid = bean.getCstGuid(); 	// 客户数据中心GUID
		String projCode = bean.getProjCode();	// 项目编号
		Timestamp time = bean.getTime(); 		// 跟进时间
		double total = bean.getTotal(); 		// 金额，针对认购、签约等
		int followType = bean.getFollowType();// 类型，表认筹、认购、签约、回款等
		String content = bean.getContent();	// 跟进内容描述
		int state = bean.getState();			// 状态，－1:不添加状态字段，0:新增，1:退房，2:换房，3:作废，4:取消/撤消
		String roomGUID = bean.getRoomGUID();	// 房间GUID
		String roomNo = bean.getRoom();		// 房间号(车位号) 
		String huxing = bean.getHuxing();		// 房型(店铺、车位、户型)

		JSONObject json = new JSONObject();
		json.put("cstGUID", cstGuid);
		json.put("projCode", projCode);
		json.put("followTime", time == null ? 0 : time.getTime() / 1000);
		json.put("followType", followType);
		json.put("followContent", content);
		json.put("mny", total);
		if (state != C.TRADE_STATUS_NONE) {
			json.put("state", state);
		}

		if (roomGUID != null && !roomGUID.equals("")) {
			json.put("roomGUID", roomGUID);
			json.put("room", roomNo);
			json.put("houseType", huxing);
		}

		int err = 0;
		String mqAddr = QueueMapMessage.BROKER_URL;
		String mqName = "";
		try {
			QueueMapMessage ms = new QueueMapMessage();
			mqName = ms.getDestination();
			ms.setMessageType(msgType);
			ms.setObj(json.toString());
			ms.send();
		} catch (Exception e) {
			log.error("send booking notice error:" + e);
			err = 1;
		}

		// 有状态用不是新增，则保存通知记录
		if (state != C.TRADE_STATUS_NONE && state != C.TRADE_STATUS_NEW) {
			log.info("save notice");
			saveNotice(cstGuid, projCode, time, followType, content, total,
					state, roomGUID, roomNo, huxing, mqAddr, mqName, err);
		}
	}

	/*
	 * 发通知
	 */
	public static void sendNotice(//
			String msgType,			// 消息队列的消息类型 
			long cstGuid, 			// 客户数据中心GUID
			String projCode,		// 项目编号
			Timestamp time, 		// 跟进时间
			double total, 			// 金额，针对认购、签约等
			int followType, 		// 类型，表认筹、认购、签约、回款等
			String content,			// 跟进内容描述
			int state,				// 状态，－1:不添加状态字段，0:新增，1:退房，2:换房，3:作废，4:取消/撤消
			String roomGUID,		// 房间GUID
			String roomNo,			// 房间号(车位号) 
			String huxing			// 房型(店铺、车位、户型)
	) {
		JSONObject json = new JSONObject();
		json.put("cstGUID", cstGuid);
		json.put("projCode", projCode);
		json.put("followTime", time == null ? 0 : time.getTime() / 1000);
		json.put("followType", followType);
		json.put("followContent", content);
		json.put("mny", total);
		if (state != C.TRADE_STATUS_NONE) {
			json.put("state", state);
		}

		if (roomGUID != null && !roomGUID.equals("")) {
			json.put("roomGUID", roomGUID);
			json.put("room", roomNo);
			json.put("houseType", huxing);
		}

		int err = 0;
		String mqAddr = QueueMapMessage.BROKER_URL;
		String mqName = "";
		try {
			QueueMapMessage ms = new QueueMapMessage();
			mqName = ms.getDestination();
			ms.setMessageType(msgType);
			ms.setObj(json.toString());
			ms.send();
		} catch (Exception e) {
			log.error("send booking notice error:" + e);
			err = 1;
		}

		// 有状态用不是新增，则保存通知记录
		if (state != C.TRADE_STATUS_NONE && state != C.TRADE_STATUS_NEW) {
			log.info("save notice");
			saveNotice(cstGuid, projCode, time, followType, content, total,
					state, roomGUID, roomNo, huxing, mqAddr, mqName, err);
		}
	} //~sendNotice

	/*
	 * 保存通知
	 * 因增加客户日志表cst_Flag，因此不再需要退房等通知的保存
	 */
	@Deprecated
	private static void saveNotice(long CstGUID, String ProjCode,
			Timestamp FollowTime, int FollowType, String FollowContent,
			double mny, int State, String roomGUID,		// 房间GUID
			String roomNo,			// 房间号(车位号) 
			String huxing,			// 房型(店铺、车位、户型)
			String MqAddr, String MqName, int Err) {
//		Connection con = ADataSource.getConnection(ADataSource.SCHEMA_BIZ);
//		PreparedStatement pstmt = null;
//		try {
//			String sql = "insert into trade_Notice(CstGUID,ProjCode,FollowTime,FollowType,FollowContent,mny,State,RoomGUID,Room,HuXing,MqAddr,MqName,Err) values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
//			pstmt = con.prepareStatement(sql);
//			pstmt.setLong(1, CstGUID);
//			pstmt.setString(2, ProjCode);
//			pstmt.setTimestamp(3, FollowTime);
//			pstmt.setInt(4, FollowType);
//			pstmt.setString(5, FollowContent == null ? "" : FollowContent);
//			pstmt.setDouble(6, mny);
//			pstmt.setInt(7, State);
//
//			pstmt.setString(8, roomGUID);
//			pstmt.setString(9, roomNo);
//			pstmt.setString(10, huxing);
//
//			pstmt.setString(11, MqAddr);
//			pstmt.setString(12, MqName);
//			pstmt.setInt(13, Err);
//			pstmt.executeUpdate();
//		} catch (Exception e) {
//			e.printStackTrace();
//			log.error("save notice error:" + e);
//		} finally {
//			ADataSource.close(null, pstmt, con);
//		}
	} //~saveNotice

	public static int getTradeState(String reason) {
		if (reason == null) {
			return C.TRADE_STATUS_NONE;
		}
		reason = reason.trim();
		if (reason.equals("") || reason.equals("0") || reason.equalsIgnoreCase("NULL")) {
			return C.TRADE_STATUS_NONE;
		}

		if ("退房".equals(reason)) {
			return C.TRADE_STATUS_REFUND;
		}
		if ("换房".equals(reason)) {
			return C.TRADE_STATUS_CHANGE;
		}
		if ("作废".equals(reason)) {
			return C.TRADE_STATUS_NULLIFY;
		}
		if ("取消预留".equals(reason)) {
			return C.TRADE_STATUS_CANCEL;
		}
		if ("撤销签约".equals(reason)) {
			return C.TRADE_STATUS_CANCEL;
		}
		return C.TRADE_STATUS_MODIFY;
	} //

	/**
	 * @see com.vanke.agent.C
	 */
	public static boolean shouldNotice(int state) {
		switch (state) {
		case C.TRADE_STATUS_NEW:	// 交易状态：新增
		case C.TRADE_STATUS_REFUND:	// 交易状态：退房
		case C.TRADE_STATUS_CHANGE:	// 交易状态：换房
		case C.TRADE_STATUS_NULLIFY:// 交易状态：作废
		case C.TRADE_STATUS_CANCEL:	// 交易状态：取消/撤消
			return true;
		}
		return false;
	}
} ///~
